package com.yc.cloud.admin.service;

import com.yc.cloud.admin.dto.request.HwCameraCreateReqDTO;
import com.yc.cloud.admin.dto.request.HwCameraUpdateReqDTO;
import com.yc.cloud.admin.dto.request.HwCameraQueryReqDTO;
import com.yc.cloud.admin.dto.request.CameraStorageStrategyBindReqDTO;
import com.yc.cloud.common.orm.CommonPage;
import com.yc.cloud.admin.vo.HwCameraVo;
import com.yc.cloud.admin.vo.HwCameraStorageRelationVo;
import com.yc.cloud.admin.vo.CameraBoundStorageStrategyVo;
import com.yc.cloud.entity.HwCamera;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 * 摄像头管理表 服务类
 * </p>
 *
 * @author kinggu
 * @since 2025-08-25
 */
public interface HwCameraService extends IService<HwCamera> {

    /**
     * 创建摄像头管理表
     * @param createReqDTO 创建参数
     * @return 创建成功后的VO对象
     */
    HwCameraVo create(HwCameraCreateReqDTO createReqDTO);

    /**
     * 更新摄像头管理表
     * @param updateReqDTO 更新参数
     * @return 更新成功后的VO对象
     */
    HwCameraVo update(HwCameraUpdateReqDTO updateReqDTO);

    /**
     * 根据查询条件查询摄像头列表
     * @param queryReqDTO 查询参数
     * @return 摄像头列表
     */
    CommonPage<HwCameraVo> list(HwCameraQueryReqDTO queryReqDTO);

    HwCameraVo getVOById(Long id);

    List<HwCameraVo> convertToVoList(List<HwCamera> entityList);

    /**
     * 将相机实体转换为VO
     * @param entity 相机实体
     * @return 相机VO
     */
    HwCameraVo convertToVo(HwCamera entity);

    HwCamera get(Long id);

    boolean delete(Long id);

    /**
     * 根据分组ID查询摄像头列表
     * @param groupId 分组ID
     * @return 摄像头列表
     */
    List<HwCameraVo> getByGroupId(Long groupId);

    /**
     * 查询未分组的摄像头列表
     * @return 摄像头列表
     */
    List<HwCameraVo> getUngrouped();

    /**
     * 统计分组下的摄像头数量
     * @param groupId 分组ID
     * @return 摄像头数量
     */
    Long countByGroupId(Long groupId);

    /**
     * 批量更新摄像头流地址
     * @return 更新的摄像头数量
     */
    Integer updateAllStreamUrls();

    /**
     * 置顶摄像头
     * @param id 摄像头ID
     * @return 是否成功
     */
    boolean pin(Long id);

    /**
     * 取消置顶摄像头
     * @param id 摄像头ID
     * @return 是否成功
     */
    boolean unpin(Long id);

    /**
     * 获取未绑定设备的摄像头列表
     * @return 未绑定摄像头的VO对象列表
     */
    List<HwCameraVo> getUnboundCameras();

    /**
     * 绑定摄像头存储策略
     * @param cameraId 摄像头ID
     * @param bindReqDTO 绑定参数
     * @return 绑定是否成功
     */
    boolean bindStorageStrategy(Long cameraId, CameraStorageStrategyBindReqDTO bindReqDTO);

    /**
     * 解绑摄像头存储策略
     * @param cameraId 摄像头ID
     * @param strategyId 存储策略ID
     * @return 解绑是否成功
     */
    boolean unbindStorageStrategy(Long cameraId, Long strategyId);

    /**
     * 获取摄像头绑定的存储策略列表
     * @param cameraId 摄像头ID
     * @return 存储策略关系列表
     */
    List<HwCameraStorageRelationVo> getStorageStrategies(Long cameraId);

    /**
     * 获取摄像头绑定的存储策略详细信息列表
     * @param cameraId 摄像头ID
     * @return 摄像头绑定的存储策略列表
     */
    List<CameraBoundStorageStrategyVo> getCameraBoundStorageStrategies(Long cameraId);

    /**
     * 获取所有在线的摄像头ID列表
     * 通过查询SIP服务器获取在线设备，然后过滤出在线的摄像头
     * 
     * @return 在线摄像头的ID列表
     */
    List<Long> getOnlineCameraIds();
} 